package com.fulin.sycnLife;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


/**
 * Condition使用实例
 * 
 * 任意一个java对象，都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait(),wait(long timeout),notify()
 * 以及notifyAll()方法，这些方法与synchronized同步关键字配合，可以实现等待/通知模式。Condition接口也提供了类似
 * Object的监视器方法,与Lock配合可以实现等待通知模式,但是这两者在使用方式和功能特性上还是有差别的。
 * 
 * @author fulin16
 *
 */
public class ConditionUseCase {
	Lock lock = new ReentrantLock();
	Condition condition = lock.newCondition();
	public void conditionWait() throws InterruptedException{
		lock.lock();
		try{
			condition.await();//調用await方法后，當前線程會釋放鎖，并在此等待。
		}finally{
			lock.unlock();
		}
	}
	
	public void conditionSingal() throws InterruptedException{
		lock.lock();
		try{
			condition.signal();//调用Condition对象的signal方法通知当前线程后，当前线程才从await方法返回，并且返回前已经获取了锁
		}finally{
			lock.unlock();
		}
	}
}
